#include "yzf_spi.h"

YZF_RESULT yzf_spi_set_ignore_bits(YZF_SPI_POINTER spi,uint8_t ignore_bits){
    YZF_REGV32 HR_SPI_CHCFG_REG YZF_DEL 0x7F800000;
    YZF_REGV32 HR_SPI_CHCFG_REG YZF_ADD SPI_RX_INVALID_BITS(ignore_bits);
    return YZF_OK;
}

YZF_RESULT yzf_spi_clear_fifos(YZF_SPI_POINTER spi){
    YZF_REGV32 HR_SPI_CHCFG_REG YZF_ADD SPI_CLEAR_FIFOS;
    return YZF_OK;
}

YZF_RESULT yzf_spi_continue_mod_on(YZF_SPI_POINTER spi){
    YZF_REGV32 HR_SPI_CHCFG_REG YZF_ADD SPI_CONTINUE_MODE;
    return YZF_OK;
}

YZF_RESULT yzf_spi_continue_mode_off(YZF_SPI_POINTER spi){
    YZF_REGV32 HR_SPI_CHCFG_REG YZF_DEL SPI_CONTINUE_MODE;
    return YZF_OK;
}

YZF_RESULT yzf_spi_rx_channel_on(YZF_SPI_POINTER spi){
    YZF_REGV32 HR_SPI_CHCFG_REG YZF_ADD SPI_RX_CHANNEL_ON;
    return YZF_OK;
}

YZF_RESULT yzf_spi_rx_channel_off(YZF_SPI_POINTER spi){
    YZF_REGV32 HR_SPI_CHCFG_REG YZF_DEL SPI_RX_CHANNEL_ON;
    return YZF_OK;
}

YZF_RESULT yzf_spi_tx_channel_on(YZF_SPI_POINTER spi){
    YZF_REGV32 HR_SPI_CHCFG_REG YZF_ADD SPI_TX_CHANNEL_ON;
    return YZF_OK;
}

YZF_RESULT yzf_spi_tx_channel_off(YZF_SPI_POINTER spi){
    YZF_REGV32 HR_SPI_CHCFG_REG YZF_DEL SPI_TX_CHANNEL_ON;
    return YZF_OK;
}

YZF_RESULT yzf_spi_set_data_bits(YZF_SPI_POINTER spi,uint32_t bits){
    YZF_REGV32 HR_SPI_CHCFG_REG YZF_DEL 0x0007FFF8;
    YZF_REGV32 HR_SPI_CHCFG_REG YZF_ADD SPI_RX_INVALID_BITS(bits);
    return YZF_OK;
}

YZF_RESULT yzf_spi_cs_status(YZF_SPI_POINTER spi,YZF_BOOL isHigh){
    YZF_REGV32 HR_SPI_CHCFG_REG YZF_DEL YZF_BIT(2);
    YZF_REGV32 HR_SPI_CHCFG_REG YZF_ADD isHigh<<2;
    return YZF_OK;
}

YZF_RESULT yzf_spi_cs_soft_control(YZF_SPI_POINTER spi,YZF_BOOL isSoft){
    YZF_REGV32 HR_SPI_CHCFG_REG YZF_DEL YZF_BIT(1);
    YZF_REGV32 HR_SPI_CHCFG_REG YZF_ADD isSoft<<1;
    return YZF_OK;
}

YZF_RESULT yzf_spi_start(YZF_SPI_POINTER spi){
    YZF_REGV32 HR_SPI_CHCFG_REG YZF_ADD SPI_START;
    return YZF_OK;
}

YZF_RESULT yzf_spi_big_endian(YZF_SPI_POINTER spi){
    YZF_REGV32 HR_SPI_SPICFG_REG YZF_ADD SPI_BIG_ENDIAN;
    return YZF_OK;
}

YZF_RESULT yzf_spi_small_endian(YZF_SPI_POINTER spi){
    YZF_REGV32 HR_SPI_SPICFG_REG YZF_DEL SPI_BIG_ENDIAN;
    return YZF_OK;
}

YZF_RESULT yzf_spi_master(YZF_SPI_POINTER spi,YZF_BOOL isMaster){
    YZF_REGV32 HR_SPI_SPICFG_REG YZF_DEL YZF_BIT(2);
    YZF_REGV32 HR_SPI_SPICFG_REG YZF_ADD isMaster<<2;
    return YZF_OK;
}

YZF_RESULT yzf_spi_CPHA(YZF_SPI_POINTER spi,YZF_BOOL isHigh){
    YZF_REGV32 HR_SPI_SPICFG_REG YZF_DEL YZF_BIT(1);
    YZF_REGV32 HR_SPI_SPICFG_REG YZF_ADD isHigh<<1;
    return YZF_OK;
}

YZF_RESULT yzf_spi_CPOL(YZF_SPI_POINTER spi,YZF_BOOL isSecond){
    YZF_REGV32 HR_SPI_SPICFG_REG YZF_DEL YZF_BIT(0);
    YZF_REGV32 HR_SPI_SPICFG_REG YZF_ADD isSecond<<0;
    return YZF_OK;
}

YZF_RESULT yzf_spi_set_clock_div(YZF_SPI_POINTER spi,uint16_t div){
    YZF_REGV32 HR_SPI_CLKCFG_REG YZF_DEL 0xFFFF;
    YZF_REGV32 HR_SPI_CLKCFG_REG YZF_ADD div;
    return YZF_OK;
}

YZF_RESULT yzf_spi_rx_fifo_int_deep(YZF_SPI_POINTER spi,uint8_t deep){
    YZF_REGV32 HR_SPI_MODECFG_REG YZF_DEL 0x1C;
    YZF_REGV32 HR_SPI_CLKCFG_REG YZF_ADD deep<<2;
    return YZF_OK;
}

YZF_RESULT yzf_spi_tx_fifo_int_deep(YZF_SPI_POINTER spi,uint8_t deep){
    YZF_REGV32 HR_SPI_MODECFG_REG YZF_DEL 0x1C0;
    YZF_REGV32 HR_SPI_CLKCFG_REG YZF_ADD deep<<6;
    return YZF_OK;
}

YZF_RESULT yzf_spi_rx_dma(YZF_SPI_POINTER spi,YZF_BOOL isEnable){
    YZF_REGV32 HR_SPI_MODECFG_REG YZF_DEL YZF_BIT(1);
    YZF_REGV32 HR_SPI_MODECFG_REG YZF_ADD isEnable<<1;
    return YZF_OK;
}

YZF_RESULT yzf_spi_tx_dma(YZF_SPI_POINTER spi,YZF_BOOL isEnable){
    YZF_REGV32 HR_SPI_MODECFG_REG YZF_DEL YZF_BIT(0);
    YZF_REGV32 HR_SPI_MODECFG_REG YZF_ADD isEnable<<0;
    return YZF_OK;
}

YZF_RESULT yzf_spi_timeout_int(YZF_SPI_POINTER spi,YZF_BOOL isDisable){
    YZF_REGV32 HR_SPI_INT_MASK_REG YZF_DEL YZF_BIT(7);
    YZF_REGV32 HR_SPI_MODECFG_REG YZF_ADD isDisable<<7;
    return YZF_OK;
}

YZF_RESULT yzf_spi_done_int(YZF_SPI_POINTER spi,YZF_BOOL isDisable){
    YZF_REGV32 HR_SPI_INT_MASK_REG YZF_DEL YZF_BIT(6);
    YZF_REGV32 HR_SPI_MODECFG_REG YZF_ADD isDisable<<6;
    return YZF_OK;
}

YZF_RESULT yzf_spi_rx_fifo_overflow_int(YZF_SPI_POINTER spi,YZF_BOOL isDisable){
    YZF_REGV32 HR_SPI_INT_MASK_REG YZF_DEL YZF_BIT(5);
    YZF_REGV32 HR_SPI_MODECFG_REG YZF_ADD isDisable<<5;
    return YZF_OK;
}

YZF_RESULT yzf_spi_rx_fifo_under_int(YZF_SPI_POINTER spi,YZF_BOOL isEnable){
    YZF_REGV32 HR_SPI_INT_MASK_REG YZF_DEL YZF_BIT(4);
    YZF_REGV32 HR_SPI_MODECFG_REG YZF_ADD isEnable<<4;
    return YZF_OK;
}

YZF_RESULT yzf_spi_tx_fifo_overflow_int(YZF_SPI_POINTER spi,YZF_BOOL isDisable){
    YZF_REGV32 HR_SPI_INT_MASK_REG YZF_DEL YZF_BIT(3);
    YZF_REGV32 HR_SPI_MODECFG_REG YZF_ADD isDisable<<3;
    return YZF_OK;
}

YZF_RESULT yzf_spi_tx_fifo_under_int(YZF_SPI_POINTER spi,YZF_BOOL isDisable){
    YZF_REGV32 HR_SPI_INT_MASK_REG YZF_DEL YZF_BIT(2);
    YZF_REGV32 HR_SPI_MODECFG_REG YZF_ADD isDisable<<2;
    return YZF_OK;
}

YZF_RESULT yzf_spi_rx_fifo_rdy_int(YZF_SPI_POINTER spi,YZF_BOOL isDisable){
    YZF_REGV32 HR_SPI_INT_MASK_REG YZF_DEL YZF_BIT(1);
    YZF_REGV32 HR_SPI_MODECFG_REG YZF_ADD isDisable<<1;
    return YZF_OK;
}

YZF_RESULT yzf_spi_tx_fifo_rdy_int(YZF_SPI_POINTER spi,YZF_BOOL isDisable){
    YZF_REGV32 HR_SPI_INT_MASK_REG YZF_DEL YZF_BIT(0);
    YZF_REGV32 HR_SPI_MODECFG_REG YZF_ADD isDisable<<0;
    return YZF_OK;
}

YZF_BOOL yzf_spi_timeout_int_status(YZF_SPI_POINTER spi){
    return YZF_REGV32 HR_SPI_INT_STATUS_REG & YZF_BIT(7);
}


YZF_RESULT yzf_spi_timeout_int_status_clear(YZF_SPI_POINTER spi){
    YZF_REGV32 HR_SPI_INT_STATUS_REG YZF_SET YZF_BIT(7);
    return YZF_OK;
}

YZF_BOOL yzf_spi_done_int_status(YZF_SPI_POINTER spi){
    return YZF_REGV32 HR_SPI_INT_STATUS_REG & YZF_BIT(6);
}

YZF_RESULT yzf_spi_done_int_status_clear(YZF_SPI_POINTER spi){
    YZF_REGV32 HR_SPI_INT_STATUS_REG YZF_SET YZF_BIT(6);\
    return YZF_OK;
}

YZF_BOOL yzf_spi_rx_overflow_int_status(YZF_SPI_POINTER spi){
    return YZF_REGV32 HR_SPI_INT_STATUS_REG & YZF_BIT(5);
}

YZF_RESULT yzf_spi_rx_overflow_int_status_clear(YZF_SPI_POINTER spi){
    YZF_REGV32 HR_SPI_INT_STATUS_REG YZF_SET YZF_BIT(5);
    return YZF_OK;
}

YZF_BOOL yzf_spi_rx_under_int_status(YZF_SPI_POINTER spi){
    return YZF_REGV32 HR_SPI_INT_STATUS_REG & YZF_BIT(4);
}

YZF_RESULT yzf_spi_rx_under_int_status_clear(YZF_SPI_POINTER spi){
    YZF_REGV32 HR_SPI_INT_STATUS_REG YZF_SET YZF_BIT(4);
    return YZF_OK;
}

YZF_BOOL yzf_spi_tx_overflow_int_status(YZF_SPI_POINTER spi){
    return YZF_REGV32 HR_SPI_INT_STATUS_REG & YZF_BIT(3);
}

YZF_RESULT yzf_spi_tx_overflow_int_status_clear(YZF_SPI_POINTER spi){
    YZF_REGV32 HR_SPI_INT_STATUS_REG YZF_SET YZF_BIT(3);
    return YZF_OK;
}

YZF_BOOL yzf_spi_tx_under_int_status(YZF_SPI_POINTER spi){
    return YZF_REGV32 HR_SPI_INT_STATUS_REG & YZF_BIT(2);
}

YZF_RESULT yzf_spi_tx_under_int_status_clear(YZF_SPI_POINTER spi){
    YZF_REGV32 HR_SPI_INT_STATUS_REG YZF_SET YZF_BIT(2);
}

YZF_BOOL yzf_spi_rx_fifo_rdy_int_status(YZF_SPI_POINTER spi){
    return YZF_REGV32 HR_SPI_INT_STATUS_REG & YZF_BIT(1);
}

YZF_RESULT yzf_spi_rx_fifo_rdy_int_status_clear(YZF_SPI_POINTER spi){
    YZF_REGV32 HR_SPI_INT_STATUS_REG YZF_SET YZF_BIT(1);
}

YZF_BOOL yzf_spi_tx_fifo_rdy_int_status(YZF_SPI_POINTER spi){
    return YZF_REGV32 HR_SPI_INT_STATUS_REG & YZF_BIT(0);
}

YZF_RESULT yzf_spi_tx_fifo_rdy_int_status_clear(YZF_SPI_POINTER spi){
    YZF_REGV32 HR_SPI_INT_STATUS_REG YZF_SET YZF_BIT(0);
}

YZF_BOOL yzf_spi_is_busy(YZF_SPI_POINTER spi){
    return YZF_REGV32 HR_SPI_STATUS_REG & YZF_BIT(12);
}

uint8_t yzf_spi_rx_fifo_deep(YZF_SPI_POINTER spi){
    return (YZF_REGV32 HR_SPI_STATUS_REG >> 6) & 0x3F;
}

uint8_t yzf_spi_tx_fifo_deep(YZF_SPI_POINTER spi){
    return (YZF_REGV32 HR_SPI_STATUS_REG & 0x3F);
}

YZF_RESULT yzf_spi_tx_data(YZF_SPI_POINTER spi,uint32_t data){
    YZF_REGV32 HR_SPI_TXDATA_REG YZF_SET data;
    return YZF_OK;
}

uint32_t yzf_spi_rx_data(YZF_SPI_POINTER spi){
    return YZF_REGV32 HR_SPI_RXDATA_REG;
}